package com.coolingme.auth.v3builder;

import com.coolingme.auth.Member;

/**
 * 抽象处理器,同时使用建造者模式
 *
 * @author wangyue
 * @date 2020-09-23 21:24
 */
public abstract class AbstractAuthHandler {

    protected AbstractAuthHandler chain;

    /**
     * 客户端无需进行链式组装，所以setNextChain()可以设置为private，更加高内聚
     *
     * @param chain AbstractAuthHandler
     */
    private void setNextChain(AbstractAuthHandler chain) {
        this.chain = chain;
    }

    /**
     * 认证授权
     *
     * @param member Member
     */
    public abstract void doAuth(Member member);

    /**
     * 建造者
     *
     * @author wangyue
     * @date 2020-09-23 22:03
     */
    public static class Builder {
        /**
         * 责任链的头
         */
        private AbstractAuthHandler head;

        /**
         * 责任链的尾
         */
        private AbstractAuthHandler tail;

        /**
         * 向责任链中添加处理器
         *
         * @param handler 处理器
         * @return this
         */
        public Builder addHandler(AbstractAuthHandler handler) {
            // 责任链中还没有处理器，将handler设置为头尾
            if (this.head == null) {
                this.head = this.tail = handler;
                return this;
            }
            // 责任链存在处理器，将handler添加进责任链中
            this.tail.setNextChain(handler);
            // 并将handler设置为尾
            this.tail = handler;
            return this;

            // TODO 真正框架中，如果是双向链表，会判断是否已经到了尾部
//            do {
//                if (this.head == null) {
//                    this.head = this.tail = handler;
//                    return this;
//                }
//                this.tail.setNextChain(handler);
//                this.tail = handler;
//                return this;
//            } while (false);

        }

        /**
         * 建造责任链
         *
         * @return 责任链头
         */
        public AbstractAuthHandler build() {
            return this.head;
        }

    }

}
